The maintenance of large and long-lived software systems is difficult and costly. Such software systems have been increasing in their size, number, and complexity. It has been estimated that up to 60% of the total cost of a software life cycle can be attributed to maintenance. This cost will increase as software assumes an ever more important role in products of all types. Software maintenance is difficult because it requires a high level of understanding of the system from a maintainer working in an unfavorable environment. The understanding process is hindered by the lack of design documentation. When such documentation is available, it is often incomplete or out of date. For a large system, it is a tedious and menial task to consider all the relevant details, even when they are complete and accurate.
Software maintenance includes activities such as documenting the system; enhancing existing functionality; finding and correcting bugs; rewriting, restructuring, and adapting software; and many other activities including testing and configuration management. One common characteristic of all the facets of software maintenance is "change." Changing large software systems is often tedious, error-prone and time-consuming. Even a simple modification request may result in many inter-related changes to a variety of software artifacts. For example, renaming a function requires checking for name conflicts, renaming all of the function's occurrences in code, design documents, related test routines and user manuals. These activities are tedious because a large number of similar, low level changes must be performed using only a text editor which often results in overlooked, required changes necessitating reiterative work at a later time. Moreover, there may be many alternative ways to fulfill a modification request. Each of these alternatives needs to be evaluated in terms of cost, the scale of its impact on other parts of the system and users, its relation to future modification requests and project management. This process is often informal and incomplete. It is also error-prone because software maintainers frequently do not understand all of the software artifacts and their interrelationships. Finally, performing the selected set of changes requires coordination among many project members and must be planned and managed for maximum effectiveness. Automation of the often tedious process of analyzing, planning and performing such changes is likely to reduce human error and improve productivity.
Further complicating such activities are the many interconnected types of architecture to which thought must be given when engaging in software maintenance. Conceptual architecture describes the system in terms of components representing its major design elements, and connectors representing interrelationships between components. The module interconnection architecture organizes the system into subsystems, modules and layers with details of exported and imported interfaces. The execution architecture describes the run-time architecture of the system in terms of tasks, threads, processors, and networks. The code architecture organizes code into files, directories, program libraries, and executables. Consideration of impacts on all of these areas is required when changes in software are contemplated.
Many advances have occurred in the field of software maintenance and editing. For example, efforts have been undertaken to enhance the composing, changing and integration of modules in a complex computer system comprised of multiple modules assembled within one framework and even between different frameworks, as disclosed in the patent to Lark, et al. (U.S. Pat. No. 4,943,932). But, this patent does not address the need for an efficient method for making modifications to one such module in a complex architecture and incorporating that change throughout the software system by automatically making changes in the architecture itself and, ultimately, in the source code of the originally changed and other modules to ensure that the resulting software is error-free. Of course, expert systems which incorporate a self-modifying reasoning capability, such as the patent to Ulug (U.S. Pat. No. 4,918,620), are known, but, again, such systems have not been successfully applied to the problem of modifying both the architecture and source code of complex modular computer software. The problem of source code modification in executing software in a distributed application architecture which is only partially heterogeneous was recognized in EP0420461A2, but the solution adopted was avoidance of the necessity of source code modification by packaging load modules and recompiling them at their target. Although all of these disclosures add significant improvements in their respective fields, they all suffer from either limited applicability to the problems solved by the subject invention or the requirement of substantial and repeated user intervention. What is needed is a software maintenance system which minimizes human intervention, thereby substantially reducing the cost, time and errors associated with previous efforts in this area.